#ifndef _BSQL_H
#define _BSQL_H

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

struct field{	/*field structure 字段结构体*/
    char name[64];		/*字段名*/
    int type;			/*INT:0  STRING:1*/
    char *value;        /*键值*/
};

struct hyper_items_def		/*CREATE语句后的字段和类型链表节点结构*/
{
	char *field;		/*字段名称*/
	int type;			/*INT:0  STRING:1*/
	struct  hyper_items_def *next;
};

struct value_def	/*INSERT语句的键值链表节点结构，包括值和类型*/
{
	char* value;	/*值*/
	int type;		/*类型，INT:0  STRING:1*/
	struct value_def *next;
};

struct item_def 	/*INSERT，SELECT语句的选择字段链表节点结构，包括字段名*/
{
	char *field;	/*字段名*/
	struct item_def *next;
};

struct conditions_def	/*SELECT,UPDATE,DELETE语句的条件二叉树节点结构*/
{
	int type;                       /*键值类型，INT:0  STRING:1*/	
	struct item_def *litem;		    /*条件表达式左部的字段指针*/
    char *value;
    int cmp_op;                     /*操作符类型, '=':1 | '>':2 | '<':3 | '>=':4 | '<=':5 | '!=':6 | 'AND':7 | 'OR':8 */
    struct conditions_def *left;	/*左子树指针*/
	struct conditions_def *right;	/*右子树指针*/
};

struct table_def	/*多表SELECT语句的表链表节点结构*/
{
	char *table;	/*表名*/
	struct table_def *next;
};

struct upcon_def	/*UPDATE语句的赋值链表节点结构*/{
	char *field;	/*字段名*/
	int type;		/*类型，INT:0  STRING:1*/
	char *value;	/*值*/
	struct upcon_def *next;
};

struct exp{
    int val;
};

void freeWhere(struct conditions_def *conRoot);
int whereSearch(struct conditions_def *conRoot, int totField, char allField[][64], char value[][64]);
void createDB();
void showDB();
void useDB(char *dbname);
void createTable(char *tableval, struct hyper_items_def *Hitemroot);
void showTable();
void multiInsert(char *tableval, struct item_def *itemroot, struct value_def *valroot);
void selectWhere(struct item_def *itemroot, struct table_def *tableroot, struct conditions_def *conroot);
void deletes(char *tableval, struct conditions_def *conroot);
void updates(char *tableval, struct upcon_def *uproot, struct conditions_def *conroot);
void dropTable(char *tableval);
void dropDB(char *dbname);
int getExpVal(int a, int b, char op);

#endif